/**
 * Copyright (c) 2020 Coder League
 * All rights reserved.
 *
 * File：HttpServletUtil.java
 * History:
 *         2020年12月18日: Initially created, Chrise.
 */
package club.coderleague.cfss.util;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import club.coderleague.cfss.domain.beans.UserSession;

/**
 * HTTP服务工具。
 * @author Chrise
 */
public class HttpServletUtil {
	/**
	 * 获取HTTP请求。
	 * @author Chrise 2020年12月18日
	 * @return HTTP请求。
	 */
	public static HttpServletRequest getHttpServletRequest() {
		RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
		return requestAttributes != null ? ((ServletRequestAttributes)requestAttributes).getRequest() : null;
	}
	
	/**
	 * 获取HTTP会话。
	 * @author Chrise 2020年12月18日
	 * @return HTTP会话。
	 */
	public static HttpSession getHttpSession() {
		HttpServletRequest request = getHttpServletRequest();
		return request != null ? request.getSession(false) : null;
	}
	
	/**
	 * 获取用户会话。
	 * @author Chrise 2020年12月19日
	 * @return 用户会话。
	 */
	public static UserSession getUserSession() {
		HttpSession session = getHttpSession();
		if (session == null) return null;
		return (UserSession)session.getAttribute(UserSession.SESSION_KEY);
	}
	
	/**
	 * 获取远程主机。
	 * @author Chrise 2020年12月19日
	 * @return 远程主机。
	 */
	public static String getRemoteHost() {
		HttpServletRequest request = getHttpServletRequest();
		if (request == null) return null;
		
		String ip = request.getHeader("x-forwarded-for");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		
		return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
	}
}
